<?php
namespace core\helper;

/**
 * 工具类数据处理
 */
class Conversion{
    
    
    
    /**
     * 解析限制条件参数
     * @param $setField 设置允许查询的条件字段 
     * @param $param 设置外部传进来的参数
     * 字段参数的默认值 、限制条件、查询方式格式：
     * 默认值方式 ：
     * 'key'=> 1 、'key'=>[1,2,3] 表示默认值 等 1 和 在 [1,2,3]
     * 查询方式
     * 'key'=>'like' 表示 like 查询
     * 'key'=>'elt' /  'key'=>'egt' / 'key'=>'lt' / 'key'=>'gt'
     * 查询方式加默认值
     * 'key'=>'neq:1' 表示默认值 不等于 1 
     * 其他查询方式
     * 'key'=>'between:[aa,bb]' 表示查询在 aa < key < bb 的区间查询
     */
    public static function parseWhere(array $setField , array $param){
        $keywords = ['like','in','eq','neq','elt','egt','lt','gt','between'];
        $wheres = array();
        foreach( $setField as $key => $defval ){
            if( is_numeric($key) ){ //如果 key 是数字，则简单的字段赋值标识
                $keyret = self::dealWhereKey($defval);   
                $field = $keyret['field']; $pkey = $keyret['key'];
                if( self::checkSetValue($param,$pkey) ){
                    $wheres[$field] = is_array( $param[$pkey] ) ? array( 'in',$param[$pkey]) : $param[$pkey];
                }
            }else{ // key 不是数字时 则 key 是查询字段 ; $defval 是限制规则   
                $keyret = self::dealWhereKey($key);
                $field = $keyret['field']; $pkey = $keyret['key'];
                // 解析 默认值或 查询条件情况
                $keyword = ''; $keyworddef = '';
                if(is_string($defval)){
                    $varArr =  explode(':',$defval);
                    if( isset($varArr[1]) ){
                        $keyword = $varArr[0];  // 存在 : 分割的 第一位必须是 查询方式关键词
                        $keyworddef = $varArr[1];
                    }
                    if( in_array($defval,$keywords)) $keyword = $defval;
                }
                //
               // if( $keyword ){
                    switch($keyword){
                        case 'like':
                            if( self::checkSetValue($param,$pkey) ){
                                if( !is_string($param[$pkey])) logicE($pkey.'查询参数必须是字符串');
                                $wheres[$field] = array( 'like', '%'.$param[$pkey].'%');
                            }
                            break;
                        case 'in':
                            $pvar = ( self::checkSetValue($param,$pkey) )? $param[$pkey] : $keyworddef;
                            if( $pvar ){
                                if(!is_array($pvar)){
                                    $pvar = trim($pvar,']');  
                                    $pvar = trim($pvar,'[');
                                    $pvar = explode(',',$pvar);                                    
                                }
                                $wheres[$field] = array( 'in', $pvar);
                            }
                            break;
                        case 'between':
                            $keyworddef = trim($keyworddef,']');  
                            $keyworddef = trim($keyworddef,'[');
                            $pvarList  = explode(',',$keyworddef);
                            $startParam = (isset($param[$pvarList[0]]) && $param[$pvarList[0]]) ? $param[$pvarList[0]]:'';
                            $endParam   = (isset($param[$pvarList[1]]) && $param[$pvarList[1]]) ? $param[$pvarList[1]]:'';
                            if( $startParam && !$endParam ){
                                $wheres[$pkey] = array( 'egt', $startParam);
                            }
                            if( !$startParam && $endParam){
                                $wheres[$pkey] = array( 'lt', $startParam);
                            }
                            if( $startParam && $endParam){
                                $wheres[$pkey] = array( 'between', [$startParam,$endParam]);
                            }
                            break; 
                        case 'eq' :
                        case 'neq':
                        case 'lt' :
                        case 'gt' :
                        case 'elt':
                        case 'egt':
                            if( self::checkSetValue($param,$pkey) ){
                                $wheres[$field] = array( $keyword,$param[$pkey]);
                            }elseif($keyworddef){
                                $wheres[$field] = array( $keyword,$keyworddef);
                            }
                            break;
                        default :
                            $whereVal = self::checkSetValue($param,$pkey) ? $param[$pkey] : $defval;
                            if( $whereVal ){
                                $wheres[$field] = is_array( $whereVal ) ? array( 'in',$whereVal) : $whereVal;
                            }
                            break;
                    }
            }
        }
        return $wheres; 
    }
    
    /**
     * 检测设置查询的值
     */
    private static function checkSetValue($param,$key){
        if( !isset($param[$key]) )  return false;
        if( $param[$key] === '' )   return false;
        if( is_null($param[$key]))  return false;
        return true;
    }
    
    /**
     * 内部key设置支持
     * key  简单的key设置     
     * key=paramkey [ key 表示去数据库匹配的字段 paramkey 表示外部传进来的字段匹配]
     * table.key  [ 连表：table.key 表示去数据库匹配的字段 ,key 表示外部传进来的字段匹配]
     * table.key=paramkey
     * @return [ field => 数据库匹配字段 , key => 外部传值字段]
     */
    private static function dealWhereKey($setKey){
        $keyArr = explode('=',$setKey);
        if( isset($keyArr[1]) ){
            return ['field' => $keyArr[0],'key'=> $keyArr[1]];
        }
        $keyArr = explode('.',$setKey);
        if( isset($keyArr[1]) ){
            return ['field' => $setKey,'key'=> $keyArr[1]];
        }
        return ['field' => $setKey,'key'=> $setKey];
    }
}